#ifndef __quantum_kinetics_qk__
#define __quantum_kinetics_qk__

#include <iostream>
#include <string.h>
#include <complex>
#include <math.h>
#include <armadillo>


#define MKL_Complex16 std::complex<double>

/*---------------------------------------------------------------------------*/
/* Definitions */
#define pi   3.141592653589793
#define hbar 0.652 /* eVfs */
/*---------------------------------------------------------------------------*/

typedef unsigned long            indextype;
typedef std::complex<double>     dcomplex;
typedef arma::cx_mat             complex_matrix;
typedef arma::mat                real_matrix;

typedef complex_matrix*               complex_matrix_ptr;
typedef std::vector<complex_matrix>   complex_matrix_function;
typedef complex_matrix_function*      complex_matrix_function_ptr;

typedef struct parameters
{
  double tstart;
  double tend;
  double memwidth;
  double deltakx;
  int    ntdiag;
  int    ntmem;
  int    num_bands;
  int    num_mesh_points;
  int    num_mesh_points_x;

  // Control
  double tolerance;
  int    maxiter;
};

#endif
